package cn.yougou.serviceImpl;


import cn.yougou.common.*;
import cn.yougou.dto.Query;
import cn.yougou.mapper.YgCouponsMapper;
import cn.yougou.pojo.YgCoupons;
import cn.yougou.pojo.YgUserBasicsinfo;

import cn.yougou.pojo.YgUserCoupons;
import cn.yougou.service.*;

import cn.yougou.service.shopcart.YgCategoryService;
import cn.yougou.service.shopcart.YgCommodityService;
import cn.yougou.service.shopcart.YgCouponsService;
import cn.yougou.service.user.YgOrderService;
import cn.yougou.service.user.YgUserBasicsinfoService;
import cn.yougou.vo.YgCouponsSelAllVo;


import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;

/**
 * (YgCoupons)表服务实现类
 *
 * @author makejava
 * @since 2020-12-20 09:15:42
 */
@Service
public class YgCouponsServiceImpl implements YgCouponsService {

    @Autowired
    private YgCouponsMapper ygCouponsDao;

    @Autowired
    private VoDataUtil voDataUtil;
    @Autowired
    private CouponUtil couponUtil;
    @Autowired
    private EnumUtil enumUtil;
    @Autowired
    private YgCommodityService ygCommodityService;
    @Autowired
    private YgCategoryService ygCategoryService;
    @Reference(check = false)
    private YgOrderService ygOrderService;
    @Autowired
    private AnalysisFileUtil analysisFileUtil;
    @Reference
    private YgUserBasicsinfoService ygUserBasicsinfoService;
    @Autowired
    private YgUserCouponsService YgUserCouponsService;

    public YgCouponsServiceImpl() {
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public YgCoupons queryById(Integer id) {
        return this.ygCouponsDao.queryById(id);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<YgCoupons> queryAllByLimit(int offset, int limit) {
        return this.ygCouponsDao.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param ygCoupons 实例对象
     * @return 实例对象
     */
    @Override
    public YgCoupons insert(YgCoupons ygCoupons) {
        this.ygCouponsDao.insert(ygCoupons);
        return ygCoupons;
    }

    /**
     * 修改数据
     *
     * @param ygCoupons 实例对象
     * @return 实例对象
     */
    @Override
    public YgCoupons update(YgCoupons ygCoupons) {
        this.ygCouponsDao.update(ygCoupons);
        return this.queryById(ygCoupons.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer id) {
        return this.ygCouponsDao.deleteById(id) > 0;
    }

    /**
     * 封装数据
     * */
    @Override
    public List selCouponsTemp(Query query) {
       // List<YgCoupons> ygList=ygCouponsDao.queryAllLimit(query);
        //封装 除了scope之外的参数
        List<YgCouponsSelAllVo> ygCouponsList =voDataUtil.returnYgCouponsSelAllVo(ygCouponsDao.queryAllLimit(query));
        return ygCouponsList;
    }

    @Override
    public int selCount(Query query) {
        return ygCouponsDao.selCount(query);
    }
    /**
     * 获得商品列表和商品类型列表
     * */
    @Override
    public Map returnCommodityAndCategoryList() {
        Map map = new HashMap();
        //查询商品列表
        map.put("commodity",ygCommodityService.returnCommodityIDandNameList());
        //查询商品类型列表
        map.put("category",ygCategoryService.returnCategoryIDandNameList());
        return map;
    }

    @Override
    public int insertAndUpdata(YgCoupons ygCoupons) {

        return  ygCouponsDao.insert(ygCoupons);
    }

    @Override
    public List getCouponList(Integer ygCommodityid, Integer ygCategoryid, Integer ygUserid) {
        //查出 商品实体类
        //查出 商品类型实体类
      //获取优惠卷列表
        List<YgCoupons> ygCoupons = ygCouponsDao.queryAll(new YgCoupons(0));
      //通过couponUtil  返回根据领取类型 分类的Map
        Map<String,List<YgCoupons>> map= couponUtil.getRulesMap(ygCoupons);
      //进行符合领取条件筛选 将符合条件的优惠卷组成list 返回
        List<YgCoupons> ocnformToRulesList=  getConformToRulesList(map,ygCommodityid,ygCategoryid,ygUserid);
       //拼接一个vo

        return voDataUtil.YgGetCouponListVo(ocnformToRulesList);
    }
    /**
    * 创建一个用户优惠券
    * */
    @Override
    public Integer createCoupon(Integer couponId, Integer userId) {

        //查询优惠券实体 查询时判断 是否优惠卷数量是否大于零
        YgCoupons ygCoupons =  ygCouponsDao.queryByIdAndNum(couponId);
        Integer result =0;
        if(ygCoupons ==null){
            return 0;
        }
        //如果有数据 则进一步 处理数据
       //判断优惠券数量上限 如果等于0 就不执行之后的方法
            if(ygCoupons.getCouponscount()>=-1) {
                if (ygCoupons.getCouponscount() == 0) {
                    ygCouponsDao.update(new YgCoupons(couponId,2));
                    return 0;
                }
            }
            //判断优惠券领取上限 如果查用户拥有优惠卷数量大于或等于限制领取数量 就不知之后的方法
        if(!getMax(ygCoupons,userId)){
            return 0;
        }
            //需要处理的数据：
            //startDate  endDate
            Integer couponsTime = ygCoupons.getCouponsTime();
            //startDate 获取现在的时间
            String nowTime_en =DateUtil8.getNowTime_EN();
            String AfterOrPreDateTime ="";
            if(couponsTime !=null){
                //endDate 与 couponsTime 相加 获得过期时间
                 AfterOrPreDateTime = DateUtil8.getAfterOrPreDateTime(nowTime_en, "day", couponsTime);
            }
              result = YgUserCouponsService.insert(new YgUserCoupons(userId,ygCoupons.getId(),ygCoupons.getCoupontitile(),
                   ygCoupons.getCouponrules(),ygCoupons.getCouponrulestitle(),ygCoupons.getCouponrulesjudge(),ygCoupons.getCouponmoney(),nowTime_en,AfterOrPreDateTime,0,ygCoupons.getStopdate()));
            //优惠券数量减少 如果数量为 -1 则不执行

            if(ygCoupons.getCouponscount()>0){
                result+= ygCouponsDao.reduceCouponCount(ygCoupons.getId());
            }else if(ygCoupons.getCouponscount() ==-1){
                result+= 1;
            }
            return result;



    }

    /**
     * 遍历
     * */
    public List<YgCoupons> getConformToRulesList(Map<String,List<YgCoupons>> map,Integer ygCommodityid, Integer ygCategoryid, Integer ygUserid){
       //声明 返回参数 list
        List<YgCoupons> resultList= new ArrayList<>();
        //遍历map key 通过对应的 条件判断符合的优惠卷并返回
       for(Map.Entry<String,List<YgCoupons>> item :map.entrySet()){
           //遍历list 执行对应的 判断方法
           for(YgCoupons ygCoupons :item.getValue()){
              if(Getjudge(item.getKey().toLowerCase(),ygCoupons, ygCommodityid,  ygCategoryid,  ygUserid)){
                  //符合领取条件
                  resultList.add(ygCoupons);
              }
           }
       }

        //符合 领取最大上限条件
        for(int i =0;i<resultList.size();i++){
            if(!getMax(resultList.get(i),1)){
                resultList.get(i).setIsGet(1);
            }
        }
      /*  //优惠卷 数量大于0
        for(int i =0;i<resultList.size();i++){
            if(resultList.get(i).getCouponscount()>=-1){
                if(resultList.get(i).getCouponscount()==0){
                    resultList.remove(i);
                }
            }
        }*/
        //判断是否存在于 禁用范围
        List<YgCoupons> middle= new ArrayList<>();
        for(YgCoupons item:resultList){
            if(!forbidScopeJudge(item,ygCommodityid)){
                middle.add(item);
            }
        }

        resultList =middle;
        return resultList;
    }
    /**
     * 判断是否 存在于 禁用范围
     * */
    public boolean forbidScopeJudge(YgCoupons ygCoupons,Integer ygCommodityid){
       if(ygCoupons!=null){
           List<String> fileAssignLineList = analysisFileUtil.getFileAssignLineList(ygCoupons.getForbidScope(), 0);
           for(String item :fileAssignLineList){
               if(ygCommodityid!=null){
                   if(item.equals(ygCommodityid.toString())){
                       return true;
                   }
               }
           }
       }

        return false;
    }

    @Override
    public List<YgCoupons> queryAllById(List idList) {
        return ygCouponsDao.queryAllById(idList);
    }

    /**
     * 判断是否领取上限
     * */
    public boolean getMax(YgCoupons ygCoupons,Integer ygUserid){
        //获取优惠卷id 和 优惠卷限制领取数量
        //获取用户id
        Integer result = YgUserCouponsService.queryCouponCount(new YgUserCoupons(ygUserid, ygCoupons.getId()));
        //使用用户id 查询 用户实例优惠卷表 看记录
        if(result != null){
            if(result < ygCoupons.getRepetitionget()){
                return true;
            }
        }
        return false;
    }
    /**
     * 领取条件
     * */
    public boolean Getjudge(String key,YgCoupons ygCoupons,Integer ygCommodityid, Integer ygCategoryid, Integer ygUserid){
        try {
            Method methods = this.getClass().getMethod(key,YgCoupons.class,Integer.class,Integer.class,Integer.class);
           boolean flag= (Boolean) methods.invoke(this,ygCoupons, ygCommodityid,  ygCategoryid,  ygUserid);
            if(flag){
                return flag;
            }
            /////////// catch
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
            return false;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return false;
        } catch (InvocationTargetException e) {
            e.printStackTrace();
            return false;
        }
        return false;
    }

    /**
     *新人首单  领取判断规则
     * 在账单表中查询： 如果没有已经消费完成的订单 则满足条件
     * */
    public Boolean newpeople(YgCoupons ygCoupons,Integer ygCommodityid, Integer ygCategoryid, Integer ygUserid){

      if(ygUserid !=null){
          Integer result = ygOrderService.getOkOrder(ygUserid);
          if(result==0){
              return true;
          }
      }

       return false;

    }
    /**
     *种类特卖  领取判断规则
     * 判断 传来商品的类型编号 是否存在于 该优惠卷的 类型范围
     * */
    public Boolean bytype(YgCoupons ygCoupons,Integer ygCommodityid, Integer ygCategoryid, Integer ygUserid){
    if(ygCategoryid != null){
        List<String> fileAssignLineList = analysisFileUtil.getFileAssignLineList(ygCoupons.getTypeid(), 0);
        for(String item :fileAssignLineList){
            if(item.equals(ygCategoryid.toString())){
                return true;
            }
        }
    }

        return false;
    }

    /**
     *商品特惠  领取判断规则
     * 判断商品是否在 优惠卷使用范围
     * */
    public Boolean bycommodity(YgCoupons ygCoupons,Integer ygCommodityid, Integer ygCategoryid, Integer ygUserid){
      if(ygCommodityid !=null){
          List<String> fileAssignLineList = analysisFileUtil.getFileAssignLineList(ygCoupons.getCommodityid(), 0);
          for(String item :fileAssignLineList){
              if(item.equals(ygCommodityid.toString())){
                  return true;
              }
          }
      }

        return false;
    }
    /**
     *会员优惠  领取判断规则
     * 判断会员等级是否达到
     * */
    public Boolean superdiscounts(YgCoupons ygCoupons,Integer ygCommodityid, Integer ygCategoryid, Integer ygUserid){
   if(ygUserid!=null){
       //获得会员等级
       YgUserBasicsinfo ygUserBasicsinfo = ygUserBasicsinfoService.queryById(ygUserid);
       String getrulesjudge = ygCoupons.getGetrulesjudge();
       if(ygUserBasicsinfo.getLevel()!=null &&getrulesjudge!=null){
           if(Integer.parseInt(getrulesjudge)<=ygUserBasicsinfo.getLevel()){
               return true;
           }
       }
   }

        return false;
    }
}